package top.blueShark.template.service.impl;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import top.blueShark.template.entity.SysRole;
import top.blueShark.template.mapper.SysRoleMapper;
import top.blueShark.template.mapper.SysRoleMenuMapper;
import top.blueShark.template.service.SysRoleService;

import javax.annotation.Resource;

import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import java.util.Objects;

/**
 * 角色服务实现类
 */
@Service
public class SysRoleServiceImpl implements SysRoleService {
	private static final Logger logger = LoggerFactory.getLogger(SysRoleServiceImpl.class);

	@Resource
	private SysRoleMapper sysRoleMapper;
	@Resource
	private SysRoleMenuMapper sysRoleMenuMapper;

	@Override
	public List<SysRole> getRoleList(int page, int pageSize, Integer status, String roleName) {
		logger.info("查询角色列表，页码：{}，每页数量：{}", page, pageSize);
		int offset = (page - 1) * pageSize;
		List<SysRole> roles = sysRoleMapper.selectRoleList(offset, pageSize, status , roleName);
		// 查询每个角色的菜单ID列表 (对应权限)
		for (SysRole role : roles) {
			List<Integer> menuIds = sysRoleMapper.selectMenuIdsByRoleId(role.getId()); // <-- 调用新的方法
			role.setPermissions(menuIds); // SysRole 实体中的 permissions 字段现在存储 menu_id
		}
		return roles;
	}

	@Override
	public int getRoleCount() {
		logger.info("查询角色总数");
		return sysRoleMapper.selectRoleCount();
	}

	@Override
	public void addRole(SysRole role) {
		logger.info("添加角色，名称：{}，状态：{}，备注：{}", role.getName(), role.getStatus(), role.getRemark());
		// 生成UUID
		String roleId = UUID.randomUUID().toString();
		role.setId(roleId);
		role.setCreateTime(new Date());
		// 插入角色
		sysRoleMapper.insertRole(role);
		// 插入角色菜单关联 (原权限)
		if (role.getPermissions() != null && !role.getPermissions().isEmpty()) {
			// 过滤掉 null
			List<Integer> validMenuIds = role.getPermissions().stream() // 注意：这里现在是菜单ID
					.filter(Objects::nonNull)
					.collect(Collectors.toList());
			if (!validMenuIds.isEmpty()) {
				sysRoleMapper.insertRoleMenus(role.getId(), validMenuIds); // <-- 调用新的方法
			}
		}
	}

	@Override
	@Transactional
	public void updateRole(SysRole role) {
		logger.info("更新角色，ID：{}，名称：{}，状态：{}，备注：{}", role.getId(), role.getName(), role.getStatus(), role.getRemark());
		// 更新角色基本信息
		SysRole sysRole = sysRoleMapper.selectById(role.getId());
		if (StringUtils.isEmpty(role.getName())){
			role.setName(sysRole.getName());
		}
		if (StringUtils.isEmpty(role.getStatus())){
			role.setStatus(sysRole.getStatus());
		}
		if (StringUtils.isEmpty(role.getRemark())){
			role.setRemark(sysRole.getRemark());
		}
		sysRoleMapper.updateRole(role);
		// 先删除原有菜单关联，再插入新菜单关联 (原权限变更)
		sysRoleMapper.deleteRoleMenus(role.getId()); // <-- 调用新的方法
		if (role.getPermissions() != null && !role.getPermissions().isEmpty()) {
			// 过滤掉 null
			List<Integer> validMenuIds = role.getPermissions().stream() // 注意：这里现在是菜单ID
					.filter(Objects::nonNull)
					.collect(Collectors.toList());
			if (!validMenuIds.isEmpty()) {
				sysRoleMapper.insertRoleMenus(role.getId(), validMenuIds); // <-- 调用新的方法
			}
		}
	}

	@Override
	public List<Integer> getMenuIdsByRoleId(String roleId) { // <-- 更名为 getMenuIdsByRoleId
		return sysRoleMapper.selectMenuIdsByRoleId(roleId); // <-- 调用新的方法
	}

    // 新增：根据ID获取角色实现
    @Override
    public SysRole getById(String id) {
        return sysRoleMapper.selectById(id);
    }

	@Override
	public List<SysRole> getAllRoles() {
		return sysRoleMapper.selectAllRoles();
	}

	@Override
        public void addRoleWithFixedId(SysRole role) {
            logger.info("添加固定ID角色，ID：{}，名称：{}，状态：{}，备注：{}", role.getId(), role.getName(), role.getStatus(), role.getRemark());
            // 注意：此方法假定 role.getId() 已经被调用者设置好了，不会在这里生成UUID。
            // 确保ID不为空
            if (role.getId() == null || role.getId().isEmpty()) {
                throw new IllegalArgumentException("When using addRoleWithFixedId, the role ID must be provided.");
            }
            role.setCreateTime(new Date());
            sysRoleMapper.insertRole(role);
            // 插入角色菜单关联 (原权限，如果需要)
            if (role.getPermissions() != null && !role.getPermissions().isEmpty()) {
                List<Integer> validMenuIds = role.getPermissions().stream() // 注意：这里现在是菜单ID
                    .filter(Objects::nonNull)
                    .collect(Collectors.toList());
                if (!validMenuIds.isEmpty()) {
                    sysRoleMapper.insertRoleMenus(role.getId(), validMenuIds); // <-- 调用新的方法
                }
            }
        }

	@Override
	public SysRole getByRoleName(String roleName) {
		return sysRoleMapper.selectByRoleName(roleName);
	}

	@Override
	public List<String> getRoleIdsList(List<String> userRolesName) {
		return sysRoleMapper.getRoleIdsByRoleName(userRolesName);
	}

	@Override
	public List<SysRole> getRoleListByStatus(String status) {
		return sysRoleMapper.selectRoleListByStatus(status);
	}

	@Override
	@Transactional
	public void deleteRoleById(String id) {
		//先删除 sys_role_menu
		sysRoleMenuMapper.delete(id);
		sysRoleMapper.delete(id);
	}
}